package gui.estudiante;

import java.awt.Font;
import java.awt.Rectangle;
import java.awt.SystemColor;
import java.awt.event.KeyEvent;
import java.text.DateFormat;
import java.util.Date;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

import utils.Utilidad;

import com.toedter.calendar.JCalendar;

import entidad.Calificacion;
import entidad.CalificacionDetalle;
import gui.calificacion.PanelCalificacionesPorEstudiante;
import gui.curso.PanelCurso;

import javax.swing.JRadioButton;

import modelo.ModeloCalificacion;
import modelo.ModeloCalificacionDetalle;

public class PanelAgregarCalificacion extends JPanel {

	private static final long serialVersionUID = 1L;
	private JLabel lblFecha = null;
	private JTextField txtFecha = null;
	private JLabel lblDescripcion = null;
	private JLabel lblNotaCurso = null;
	private JTextArea txtDescripcion = null;
	private JTextField txtNotaCurso = null;
	private JButton btnEscogerFecha = null;
	private JPanel panelCalificacion = null;
	private Date fechaCalificacion = null;
	private Utilidad utilidad = null; // @jve:decl-index=0:
	private JLabel lblEstatus = null;
	private JRadioButton rbtnActivo = null;
	private JRadioButton rbtnInactivo = null;
	private JButton btnAceptar = null;

	private ButtonGroup grupoBotonesEstatus = null; // @jve:decl-index=0:
	private ModeloCalificacionDetalle modeloCalificacionDetalle = null;
	private ModeloCalificacion modeloCalificacion = null;
	private int puntosAcumulado = 0;

	/**
	 * This is the default constructor
	 */
	public PanelAgregarCalificacion() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.modeloCalificacionDetalle = ModeloCalificacionDetalle
				.getInstancia();
		this.modeloCalificacion = ModeloCalificacion.getInstancia();
		this.grupoBotonesEstatus = new ButtonGroup();
		this.utilidad = Utilidad.getInstancia();
		lblNotaCurso = new JLabel();
		lblNotaCurso.setText("Nota Curso:");
		lblNotaCurso.setBounds(new Rectangle(14, 70, 82, 22));
		lblDescripcion = new JLabel();
		lblDescripcion.setText("Descripcion:");
		lblDescripcion.setBounds(new Rectangle(14, 105, 79, 22));
		lblFecha = new JLabel();
		lblFecha.setText("Fecha:");
		lblFecha.setBounds(new Rectangle(14, 34, 64, 22));
		this.setSize(389, 407);
		this.setLayout(null);
		this.add(getPanelCalificacion(), null);
		this.add(getBtnAceptar(), null);

		utilidad.formatearCampos(txtFecha, txtDescripcion, txtNotaCurso);
	}

	/**
	 * This method initializes txtFecha
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getTxtFecha() {
		if (txtFecha == null) {
			txtFecha = new JTextField();
			txtFecha.setBounds(new Rectangle(114, 34, 125, 22));
			txtFecha.setEnabled(false);
		}
		return txtFecha;
	}

	/**
	 * This method initializes txtDescripcion
	 * 
	 * @return javax.swing.JTextArea
	 */
	private JTextArea getTxtDescripcion() {
		if (txtDescripcion == null) {
			txtDescripcion = new JTextArea();
			txtDescripcion.setBounds(new Rectangle(114, 105, 222, 116));
		}
		return txtDescripcion;
	}

	/**
	 * This method initializes txtNotaCurso
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getTxtNotaCurso() {
		if (txtNotaCurso == null) {
			txtNotaCurso = new JTextField();
			txtNotaCurso.setBounds(new Rectangle(114, 68, 125, 22));
			txtNotaCurso.addKeyListener(new java.awt.event.KeyAdapter() {
				public void keyReleased(java.awt.event.KeyEvent e) {

					int puntuacion = txtNotaCurso.getText().trim().equals("") ? 0
							: Integer.parseInt(txtNotaCurso.getText()
									.toString());
					puntosAcumulado = modeloCalificacionDetalle
							.getNotaCursoActivo(PanelEstudiantesPorCurso
									.getIdEstudiante(), PanelCurso.getIdCurso());

					final int puntuacionTotal = 100;

					int puntosRestantes = 0;

					puntosRestantes = puntuacionTotal - puntosAcumulado;

					if (puntuacion > 100) {
						txtNotaCurso.setText("");
						JOptionPane
								.showMessageDialog(
										null,
										"La Nota es Acumulativa, no puede pasar de 100 puntos",
										"Atencion",
										JOptionPane.INFORMATION_MESSAGE);
					} else if (puntuacion > puntosRestantes) {
						txtNotaCurso.setText("");
						JOptionPane
								.showMessageDialog(
										null,
										"<html>Ha Excedido la acumulacion de puntos que es 100,<br>solo puede poner un puntaje igual o menor a "
												+ puntosRestantes + "</html>",
										"Atencion",
										JOptionPane.INFORMATION_MESSAGE);
					}
				}

				public void keyTyped(KeyEvent e) {
					char caracter = e.getKeyChar();
					if (((caracter < '0') || (caracter > '9'))
							&& (caracter != KeyEvent.VK_BACK_SPACE)) {
						e.consume();

					}

				}

			});

		}
		return txtNotaCurso;
	}

	/**
	 * This method initializes btnEscogerFecha
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getBtnEscogerFecha() {
		if (btnEscogerFecha == null) {
			btnEscogerFecha = new JButton();
			btnEscogerFecha.setText("fecha");
			btnEscogerFecha.setBounds(new Rectangle(244, 34, 71, 22));
			btnEscogerFecha
					.addActionListener(new java.awt.event.ActionListener() {
						@SuppressWarnings("deprecation")
						public void actionPerformed(java.awt.event.ActionEvent e) {
							@SuppressWarnings("unused")
							DateFormat formatoFecha = DateFormat
									.getDateInstance();
							Date fecha = seleccionarFechaCalificacion();
							fechaCalificacion = fecha;

							txtFecha
									.setText((fechaCalificacion.getYear() + 1900)
											+ "-"
											+ (fechaCalificacion.getMonth() + 1)
											+ "-" + fechaCalificacion.getDate());
						}
					});
		}
		return btnEscogerFecha;
	}

	private Date seleccionarFechaCalificacion() {
		JCalendar calendar = new JCalendar();
		JDialog dialogo = new JDialog();
		dialogo.setTitle("Elija Fecha de Termino del Ciclo");
		dialogo.setModal(true);
		dialogo.setContentPane(calendar);
		dialogo.setSize(300, 300);
		dialogo.setVisible(true);
		dialogo.setLocationRelativeTo(null);
		return (Date) calendar.getDate();

	}

	/**
	 * This method initializes panelCalificacion
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getPanelCalificacion() {
		if (panelCalificacion == null) {
			lblEstatus = new JLabel();
			lblEstatus.setBounds(new Rectangle(14, 255, 57, 22));
			lblEstatus.setText("Estatus:");
			panelCalificacion = new JPanel();
			panelCalificacion.setLayout(null);
			panelCalificacion.setBounds(new Rectangle(12, 14, 368, 344));
			panelCalificacion.setBorder(BorderFactory.createTitledBorder(
					BorderFactory.createLineBorder(SystemColor.controlText, 1),
					"Calificacion del Estudiante",
					TitledBorder.DEFAULT_JUSTIFICATION,
					TitledBorder.DEFAULT_POSITION, new Font("Dialog",
							Font.BOLD, 14), SystemColor.controlText));
			panelCalificacion.add(getTxtDescripcion(), null);
			panelCalificacion.add(lblDescripcion, null);
			panelCalificacion.add(getTxtNotaCurso(), null);
			panelCalificacion.add(lblNotaCurso, null);
			panelCalificacion.add(lblFecha, null);
			panelCalificacion.add(getTxtFecha(), null);
			panelCalificacion.add(getBtnEscogerFecha(), null);
			panelCalificacion.add(lblEstatus, null);
			panelCalificacion.add(getRbtnActivo(), null);
			panelCalificacion.add(getRbtnInactivo(), null);
		}
		return panelCalificacion;
	}

	/**
	 * This method initializes rbtnActivo
	 * 
	 * @return javax.swing.JRadioButton
	 */
	private JRadioButton getRbtnActivo() {
		if (rbtnActivo == null) {
			rbtnActivo = new JRadioButton();
			rbtnActivo.setBounds(new Rectangle(114, 252, 65, 22));
			rbtnActivo.setText("Activo");
			grupoBotonesEstatus.add(rbtnActivo);
		}
		return rbtnActivo;
	}

	/**
	 * This method initializes rbtnInactivo
	 * 
	 * @return javax.swing.JRadioButton
	 */
	private JRadioButton getRbtnInactivo() {
		if (rbtnInactivo == null) {
			rbtnInactivo = new JRadioButton();
			rbtnInactivo.setBounds(new Rectangle(179, 252, 74, 22));
			rbtnInactivo.setText("Inactivo");
			grupoBotonesEstatus.add(rbtnInactivo);
		}
		return rbtnInactivo;
	}

	/**
	 * This method initializes btnAceptar
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getBtnAceptar() {
		if (btnAceptar == null) {
			btnAceptar = new JButton();
			btnAceptar.setBounds(new Rectangle(84, 367, 98, 30));
			btnAceptar.setText("Aceptar");
			btnAceptar.addActionListener(new java.awt.event.ActionListener() {

				@SuppressWarnings("deprecation")
				public void actionPerformed(java.awt.event.ActionEvent e) {

					if (utilidad
							.validar(txtNotaCurso, txtFecha, txtDescripcion) == false
							|| rbtnActivo.isSelected() == false
							&& rbtnInactivo.isSelected() == false) {

						JOptionPane.showMessageDialog(null,
								"Faltan Campos por Llenar", "Error",
								JOptionPane.ERROR_MESSAGE);
					} else {
						String estatus = rbtnActivo.isSelected() ? "ACTIVO"
								: "INACTIVO";

						java.sql.Date fecha = new java.sql.Date(
								fechaCalificacion.getYear() + 1900 - 1900,
								fechaCalificacion.getMonth(), fechaCalificacion
										.getDate());

						int idCalificacion = modeloCalificacionDetalle
								.verificarCalificacion(PanelEstudiantesPorCurso
										.getIdEstudiante(), PanelCurso
										.getIdCurso());

						if (idCalificacion == 0) {
							System.out
									.println("Entre para agregar Calificacion");
							Calificacion calificacion = new Calificacion(0, 0,
									0);
							modeloCalificacion.agregar(calificacion);
							idCalificacion = modeloCalificacion
									.getUltimoRegistroDeTablaCalificacion();

						}

						CalificacionDetalle calificacionDetalle = new CalificacionDetalle(
								0, txtDescripcion.getText(), Integer
										.parseInt(txtNotaCurso.getText()
												.toString()), fecha, estatus,
								idCalificacion);

						// Agrega la Calificacion Detalle a la BD
						modeloCalificacionDetalle.agregar(calificacionDetalle);

						// Agrega la relacion CalificacionEstudianteCurso a
						// la
						// BD
						modeloCalificacionDetalle
								.agregarCursoEstudianteCalificacion(
										PanelEstudiantesPorCurso
												.getIdEstudiante(), PanelCurso
												.getIdCurso());

						modeloCalificacionDetalle
								.actualizarTableParametros(ModeloCalificacionDetalle
										.getParametro());
						PanelCalificacionesPorEstudiante panelCalificacionesPorEstudiante = PanelCalificacionesPorEstudiante
								.getInstancia();
						panelCalificacionesPorEstudiante.validarRegistros();
						panelCalificacionesPorEstudiante = null;

						utilidad.limpiar(txtNotaCurso, txtFecha,
								txtDescripcion, grupoBotonesEstatus);

						JOptionPane
								.showMessageDialog(null,
										"Calificacion Agregada con exito",
										"Confirmacion",
										JOptionPane.INFORMATION_MESSAGE);
					}

				}
			});

		}
		return btnAceptar;
	}

	/**
	 * This method initializes btnCancelar
	 * 
	 * @return javax.swing.JButton
	 */

	public int getPuntosRestantes() {
		return puntosAcumulado;
	}

	public void setPuntosRestantes(int puntosRestantes) {
		this.puntosAcumulado = puntosRestantes;
	}

} // @jve:decl-index=0:visual-constraint="33,17"

